use std::env;
use std::fs;
use std::io::Write;
use mc::lexer::Lexer;
use mc::parser::Parser;
use mc::eval::Evaler;

// 把字符串解析成数字
fn interp(input: &str) {
    let mut lexer = Lexer::new(input);
    let mut parser = Parser::new(&mut lexer);
    let code = parser.parse();
    if code.is_err() {
        println!("解析错误: {}", code.err().unwrap());
        return;
    }
    let evaler = Evaler::new();
    let result = evaler.eval(code.unwrap());
    println!("{:?}", result);
}

// Simple REPL loop
fn repl() {
    println!();
    println!("=== 明语言解释器 V0.0.1 ===");
    println!();
    println!("请输入一个数字。输入`q`或`quit`退出。");
    loop {
        // Prompt
        print!(">> ");
        // flush the buffer
        std::io::stdout().flush().unwrap();

        // Read input
        let mut input = String::new();
        std::io::stdin().read_line(&mut input).unwrap();

        // when input is "q", break the loop
        if input.trim() == "q" || input.trim() == "quit" {
            break;
        }

        // Evaluate
        interp(&input);
    }
}

fn main() {
    // 获取命令行参数，跳过第一个参数（程序的名称）
    let args: Vec<String> = env::args().collect();
    if args.len() == 1 {
        repl();
        return
    }

    let file = &args[1];

    // 读取文件内容
    let input = fs::read_to_string(file).unwrap();

    interp(&input);
}
